/** 如何让 (a == 1 && a == 2 && a == 3) 的值为true?*/


/** 法一 */
// 原理：其它类型和数字比较时,会先尝试调用valueOf然后尝试调用toString (参看09类型转换)
/*var a = {
  count: 1,
  valueOf() {
    console.log(1); // ← 说明是会先尝试valueOf
    return this.count++;
  },
  toString() {
    console.log(2);
    // return this.count++;
    return this.count++ + 'a';
  }
};
if (a == 1 && a == 2 && a == 3) {
  console.log('ok');
}*/

/** 法二 defineProperty*/
/*var i = 1;
Object.defineProperty(global/!*or window*!/, 'a', {
  get() {
    return i++;
  }
});
if (a == 1 && a == 2 && a == 3) {
  console.log('ok');
}*/

/** 法三 Symbol.toPrimitive*/
/*var a = {
  i:1
  ,[Symbol.toPrimitive](hint) {
    console.log('hint:', hint); // hint: default
    if(hint === 'default'){
      return a.i++;
    }
    return null;
  }
};
if (a == 1 && a == 2 && a == 3) {
  console.log('ok');
}*/

/** 法四 */
//原理和法一一样
/*
var a = [1, 2, 3];
a.toString = a.shift;
if (a == 1 && a == 2 && a == 3) {
  console.log('ok');
}
*/
